package pe.com.bbva.modpre.persistencia.hibernate;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.Producto;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.persistencia.ProductoDAO;
import pe.com.bbva.modpre.utileria.Busqueda;
import pe.com.bbva.modpre.utileria.ModpreUtil;

@Repository
@SuppressWarnings("serial")
public class ProductoHibernate extends BaseHibernate<Producto, Long> 
implements ProductoDAO{
	
	@Autowired
	public ProductoHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@Override
	public List<Producto> obtenerProductoxTipoBanca(TipoBanca tipoBanca) {
		return buscarHql("select p from Producto p where p.tipoBanca.id=?", tipoBanca.getId());
	}

	@Override
	public List<Producto> buscarProductos(Map<String, Object> map) {
		Busqueda filtro = Busqueda.forClass(Producto.class);
		if (map != null) {
			if(StringUtils.isNotBlank((String)map.get("codigo"))){
				filtro.add(Restrictions.ilike("codigo",
						(String)map.get("codigo"), MatchMode.ANYWHERE));
			}
			if(StringUtils.isNotBlank((String)map.get("nombre"))){
				filtro.add(Restrictions.ilike("nombre",
						(String)map.get("nombre"), MatchMode.ANYWHERE));
			}
			if(StringUtils.isNotBlank((String)map.get("nombreCorto"))){
				filtro.add(Restrictions.ilike("nombreCorto",
						(String)map.get("nombreCorto"), MatchMode.ANYWHERE));
			}
			if(StringUtils.isNotBlank((String)map.get("grupoProducto"))){
				filtro.createAlias("grupoProducto", "g");
				filtro.add(Restrictions.ilike("g.nombre",
						(String)map.get("grupoProducto"), MatchMode.ANYWHERE));
			}
			if(StringUtils.isNotBlank((String)map.get("tipoBanca"))){
				filtro.createAlias("tipoBanca", "t");
				filtro.add(Restrictions.ilike("t.nombre",
						(String)map.get("tipoBanca"), MatchMode.ANYWHERE));
			}
			if(NumberUtils.isNumber((String)map.get("cadic_1")) && 
					NumberUtils.isNumber((String)map.get("cadic_2"))){
				filtro.add(Restrictions.between("cadic", 
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("cadic_1")),
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("cadic_2"))));
			}
			if(NumberUtils.isNumber((String)map.get("comision_1")) && 
					NumberUtils.isNumber((String)map.get("comision_2"))){
				filtro.add(Restrictions.between("comision", 
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("comision_1")),
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("comision_2"))));
			}
			if(NumberUtils.isNumber((String)map.get("tipoImpositivo_1")) && 
					NumberUtils.isNumber((String)map.get("tipoImpositivo_2"))){
				filtro.add(Restrictions.between("tipoImpositivo", 
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("tipoImpositivo_1")),
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("tipoImpositivo_2"))));
			}
			if(NumberUtils.isNumber((String)map.get("peso_1")) && 
					NumberUtils.isNumber((String)map.get("peso_2"))){
				filtro.add(Restrictions.between("peso", 
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("peso_1")),
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("peso_2"))));
			}
			if(StringUtils.isNotBlank((String)map.get("estado"))){
				filtro.createAlias("estado", "e");
				filtro.add(Restrictions.ilike("e.nombre",
						(String)map.get("estado"), MatchMode.ANYWHERE));
			}
			
		}
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}

}
